import 'package:dio/dio.dart';
import 'ApiException.dart';

class HttpInterceptor extends Interceptor {
  @override
  void onRequest(RequestOptions options, RequestInterceptorHandler handler) {
    // 1. 在请求前添加 Token
    String? token = ''; // 从你的认证服务获取Token
    if (token != null) {
      options.headers['Authorization'] = 'Bearer $token';
    }

    // 2. 打印日志 (仅在 Debug 模式)
    print('--- 请求 ---');
    print('URL: ${options.uri}');
    print('Method: ${options.method}');
    print('Headers: ${options.headers}');
    print('Data: ${options.data}');

    super.onRequest(options, handler);
  }

  @override
  void onResponse(Response response, ResponseInterceptorHandler handler) {
    // 3. 打印响应日志
    print('--- 响应 ---');
    print('Data: ${response.data}');

    // 4. 统一处理后端业务逻辑
    // response.data 是后端返回的原始数据，通常是 Map<String, dynamic>
    final responseData = response.data;
    if (responseData is Map<String, dynamic>) {
      int code = responseData['errorCode'] ?? -1;
      String message = responseData['errorMsg'] ?? '未知错误';

      if (code == 0) {
        // 如果 code 为 0，表示业务成功，我们只关心 'data' 部分
        // dio 会将 response.data 替换为我们处理过的数据
        response.data = responseData['data'];
      } else {
        // 如果 code 不为 0，表示业务失败，我们抛出一个自定义异常
        // 这个异常会在 dio 的 catchError 中被捕获
        handler.reject(
          DioException(
            requestOptions: response.requestOptions,
            error: ApiException(code, message),
          ),
        );
        return; // reject 后需要 return
      }
    }

    super.onResponse(response, handler);
  }

  @override
  void onError(DioException err, ErrorInterceptorHandler handler) {
    // 5. 统一处理网络和服务器错误
    print('--- 错误 ---');
    print(err);

    final ApiException exception;
    if (err.error is ApiException) {
      // 如果是我们自己抛出的业务异常，直接使用
      exception = err.error as ApiException;
    } else {
      // 否则，根据 DioException 的类型转换为我们的自定义异常
      switch (err.type) {
        case DioExceptionType.connectionTimeout:
        case DioExceptionType.sendTimeout:
        case DioExceptionType.receiveTimeout:
          exception = ApiException(-1, "网络超时");
          break;
        case DioExceptionType.badResponse:
        // 服务器返回了错误状态码
          int statusCode = err.response?.statusCode ?? -1;
          exception = ApiException(statusCode, "服务器错误: $statusCode");
          break;
        case DioExceptionType.cancel:
          exception = ApiException(-1, "请求已取消");
          break;
        default:
          exception = ApiException(-1, "网络连接错误");
      }
    }

    // 将统一处理后的 ApiException 放入 DioException 中，方便上层捕获
    //err.error = exception;
    //super.onError(err, handler);
    // 创建新的DioException实例，而不是修改现有实例
    final newError = DioException(
      requestOptions: err.requestOptions,
      response: err.response,
      type: err.type,
      error: exception, // 在这里设置我们的自定义异常
      message: err.message,
      stackTrace: err.stackTrace,
    );
    super.onError(newError, handler);
  }
}